package com.zwh.spring.dl;//package com.zwh.spring.dl;
//
//import org.springframework.boot.SpringApplication;
//import org.springframework.context.ConfigurableApplicationContext;
//import org.springframework.stereotype.Component;
//
///**
// * Spring的三级缓存解决循环依赖
// * 第一级缓存：也叫单例池，存放已经经历了完整生命周期的Bean对象。
// * 第二级缓存：存放早期暴露出来的Bean对象，实例化以后，就把对象放到这个Map中。（Bean可能只经过实例化，属性还未填充）。
// * 第三级缓存：存放早期暴露的Bean的工厂。
// *
// * A依赖B，B依赖A
// * 1、A创建过程中需要B，于是先将A放到三级缓存，去实例化B。
// * 2、B实例化的过程中发现需要A，于是B先查一级缓存寻找A，如果没有，再查二级缓存，如果还没有，再查三级缓存，找到了A，然后把三级缓存里面的这个A放到二级缓存里面，并删除三级缓存里面的A。
// * 3、B顺利初始化完毕，将自己放到一级缓存里面（此时B里面的A依然是创建中的状态）。然后回来接着创建A，此时B已经创建结束，可以直接从一级缓存里面拿到B，去完成A的创建，并将A放到一级缓存。
// */
//@Component
//public class A {
//    private B b;
//
//    public void setB(B b) {
//        System.out.println("a");
//        this.b = b;
//    }
//
//    public A(B b) {
//        System.out.println("aa");
//        this.b = b;
//    }
//
//    public A() {
//        System.out.println("aaa");
//    }
//    public static void main(String[] args) {
//        ConfigurableApplicationContext applicationContext = SpringApplication.run(GitStudyApplication.class, args);
//        B b = applicationContext.getBean(B.class);
//        A a = applicationContext.getBean(A.class);
//        System.out.println(b);
//    }
//}
